import { showToast } from 'vant'

// Web3 错误类
export class Web3Error extends Error {
  constructor(message, code) {
    super(message)
    this.name = 'Web3Error'
    this.code = code
  }
}

// 错误代码映射
export const ERROR_CODES = {
  USER_REJECTED: 4001,
  INVALID_ADDRESS: 'INVALID_ADDRESS',
  INSUFFICIENT_FUNDS: 'INSUFFICIENT_FUNDS',
  NETWORK_ERROR: 'NETWORK_ERROR',
  CONTRACT_ERROR: 'CONTRACT_ERROR'
}

// 错误消息映射
const ERROR_MESSAGES = {
  [ERROR_CODES.USER_REJECTED]: '用户取消了操作',
  [ERROR_CODES.INVALID_ADDRESS]: '无效的地址',
  [ERROR_CODES.INSUFFICIENT_FUNDS]: '余额不足',
  [ERROR_CODES.NETWORK_ERROR]: '网络连接错误',
  [ERROR_CODES.CONTRACT_ERROR]: '合约调用错误'
}

// 处理 Web3 错误
export function handleWeb3Error(error) {
  console.error('Web3 Error:', error)

  // MetaMask 错误
  if (error.code === ERROR_CODES.USER_REJECTED) {
    showToast(ERROR_MESSAGES[ERROR_CODES.USER_REJECTED])
    return
  }

  // 地址错误
  if (error.message.includes('invalid address')) {
    showToast(ERROR_MESSAGES[ERROR_CODES.INVALID_ADDRESS])
    return
  }

  // 余额不足
  if (error.message.includes('insufficient funds')) {
    showToast(ERROR_MESSAGES[ERROR_CODES.INSUFFICIENT_FUNDS])
    return
  }

  // 网络错误
  if (error.message.includes('network')) {
    showToast(ERROR_MESSAGES[ERROR_CODES.NETWORK_ERROR])
    return
  }

  // 合约错误
  if (error.message.includes('contract')) {
    showToast(ERROR_MESSAGES[ERROR_CODES.CONTRACT_ERROR])
    return
  }

  // 其他错误
  showToast('操作失败：' + error.message)
}

// 验证以太坊地址
export function validateAddress(address) {
  try {
    return ethers.isAddress(address)
  } catch (error) {
    return false
  }
}

// 验证转账金额
export function validateAmount(amount, balance) {
  if (!amount || isNaN(amount)) return false
  if (parseFloat(amount) <= 0) return false
  if (balance && parseFloat(amount) > parseFloat(balance)) return false
  return true
}
